package gestor;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;

import utils.BCrypt;
import utils.Utilities;

import dados.Accao;
import dados.Registo;
import dados.Stock;
import dados.Utilizador;

import basedados.LigacaoBD;

public class Utilitario {
	private LigacaoBD ligacaoBD;
	private GestorBD gestorBD;

	private ArrayList<Stock> stocks;
	private ArrayList<Utilizador> utilizadores;

	public Utilitario() {
		ligacaoBD = new LigacaoBD();
		ligacaoBD.connect();
		gestorBD = new GestorBD(ligacaoBD.getConnection());
	}

	public Utilizador devolveUtilizador(String email, String password){
		Utilizador u = gestorBD.selectJogador(email);
		if (u != null) {
			if (BCrypt.checkpw(password, u.getPassword())) {
				System.out.println("Password matches");
				return u;
			} else {
				System.out.println("Password does not match");
			}
		}
		return null;
	}
	
	public Utilizador devolveUtilizador(String email){
		return gestorBD.selectJogador(email);
	}
	
	public boolean jaExisteJogador(String email){
		utilizadores = devolveTodosUtilizadores();
		for (Utilizador u : utilizadores) {
			if(u.getEmail().equals(email)){
				return true;
			}
		}
		return false;
	}

	public boolean jaExisteNome(String nome){
		for (Utilizador utilizador : utilizadores) {
			if(utilizador.getNome().equals(nome)){
				return true;
			}
		}
		return false;
	}

	public ArrayList<Utilizador> devolveTodosUtilizadores(){
		return gestorBD.selectAllUtilizadores();
	}
	
	public int passarASuperUser(Utilizador utilizador){
		return gestorBD.updateSuperUser(utilizador);
	}

	public String comboBoxUtilizadores(){
		utilizadores = devolveTodosUtilizadores();
		String comboBox = "<select name=\'lista\'>";
		for (Utilizador u : utilizadores) {
			comboBox += "<option value=\""+ u.getEmail()+"\">"+ u.getNome() +"</option>";
		}
		comboBox += "</select>";
		return comboBox;
	}
	
	public void reset(Utilizador utilizador){
		System.out.println("RESET CONTA: " + utilizador.getNome());
		//		gestorBD.deleteUtilizador(utilizador);
		utilizador.setSaldo(15000);
		gestorBD.insertUtilizador(utilizador);
		System.out.println("JA TA RESET CONTA: " + utilizador.getNome());
	}

	public void registoUtilizador(Utilizador utilizador){
		gestorBD.insertUtilizador(utilizador);
		System.out.println("SUGESTAO: " + gestorBD.insertUtilizadorSugestao(utilizador));
	}

	public String accoesUtilizador(Utilizador utilizador){
		String tabela = "";
		tabela = "<table  id=\"tabelaAccoes\" cellspacing=\"10\">\n";
		tabela += "<tr><th align=\"middle\" colspan=\"5\">Acções</th></tr>";
		tabela += "<tr><th align=\"middle\">Empresa</th>";
		tabela += "<th align=\"middle\">Sigla</th>";
		tabela += "<th align=\"middle\">Valor Aquisição</th>";
		tabela += "<th align=\"middle\">Quantidade</th>";
		tabela += "<th align=\"middle\">Valor Total</th></tr>";

		for (Accao accao : utilizador.getAccoes()) {
			tabela += "<tr>\n";
			tabela += "<td align=\"middle\">" + accao.getNome() + "</td>\n";
			tabela += "<td align=\"middle\">" + accao.getSigla() + "</td>\n";
			tabela += "<td align=\"middle\">" + Utilities.roundTo2DecimalsString(accao.getValorAquisicao()) + "$</td>\n";
			tabela += "<td align=\"middle\">" + accao.getQuantidade() + "</td>\n";
			tabela += "<td align=\"middle\">" + Utilities.roundTo2DecimalsString(accao.getValorTotal()) + "$</td>\n";
			tabela += "</tr>\n";
		}
		tabela += "</table>";
		return tabela;
	}

	public String top5Saldo(){
		ArrayList<Utilizador> utilizadores = gestorBD.top5Saldo();
		String s = "";
		s = "<table  id=\"tabelaTopSaldos\" cellspacing=\"10\">\n";
		s += "<tr><th align=\"middle\" colspan=\"2\">Top Saldos</th></tr>";
		s += "<tr><th align=\"middle\">Jogador</th>";
		s += "<th align=\"middle\">Saldo</th></tr>";

		for (Utilizador utilizador : utilizadores) {
			s += "<tr>\n";
			s += "<td>" + utilizador.getNome() + "</td>\n";
			s += "<td>" + Utilities.roundTo2DecimalsString(utilizador.getValor()) + "$</td>\n";
			s += "</tr>\n";
		}
		s += "</table>";
		return s;
	}

	public String tabelaStocks(){
		String s = "";
		s = "<table  id=\"tabelaStocks\" cellspacing=\"10\">\n";
		s += "<tr><th align=\"middle\" colspan=\"4\">Mercado</th></tr>";
		s += "<tr><th align=\"middle\">Empresa</th>";
		s += "<th align=\"middle\">Sigla</th>";
		s += "<th align=\"middle\">Cotação</th>";
		s += "<th align=\"middle\">Variação</th></tr>";

		for (Stock stock : stocks) {
			s += "<tr>\n";
			s += "<td>" + stock.getNome() + "</td>\n";
			s += "<td>" + stock.getSigla() + "</td>\n";
			s += "<td>" + Utilities.roundTo2DecimalsString(stock.getCotacao()) + "$</td>\n";
			s += "<td>" + Utilities.roundTo2DecimalsString(stock.getVariacao()) + "%</td>\n";
			s += "</tr>\n";
		}
		s += "</table>";
		return s;
	}

	public String tabelaTop5Accoes(){
		ArrayList<Utilizador> utilizadores = top5Accoes();
		String s = "";
		s = "<table  id=\"tabelaTopAccoes\" cellspacing=\"10\">\n";
		s += "<tr><th align=\"middle\" colspan=\"2\">Top Acções</th></tr>";
		s += "<tr><th align=\"middle\">Jogador</th>";
		s += "<th align=\"middle\">Valor</th></tr>";

		for (Utilizador utilizador : utilizadores) {
			s += "<tr>\n";
			s += "<td>" + utilizador.getNome() + "</td>\n";
			s += "<td>" + Utilities.roundTo2DecimalsString(utilizador.getValor()) + "$</td>\n";
			s += "</tr>\n";
		}
		s += "</table>";
		return s;
	}

	public String tabelaTop5AccoesSaldo(){
		ArrayList<Utilizador> utilizadores = top5AccoesSaldo();
		String s = "";
		s = "<table  id=\"tabelaTopValor\" cellspacing=\"10\">\n";
		s += "<tr><th align=\"middle\" colspan=\"2\">Top Valor Acções+Saldo</th></tr>";
		s += "<tr><th align=\"middle\">Jogador</th>";
		s += "<th align=\"middle\">Valor</th></tr>";

		for (Utilizador utilizador : utilizadores) {
			s += "<tr>\n";
			s += "<td>" + utilizador.getNome() + "</td>\n";
			s += "<td>" + Utilities.roundTo2DecimalsString(utilizador.getValor()) + "$</td>\n";
			s += "</tr>\n";
		}
		s += "</table>";
		return s;
	}

	public void preencheListas(){
		stocks = gestorBD.selectStocks();
		utilizadores = gestorBD.selectAllUtilizadores();
	}

	public ArrayList<Stock> stocks(){
		return gestorBD.selectStocks();
	}

	public ArrayList<Utilizador> top5Accoes(){
		ArrayList<Utilizador> aux = utilizadores;
		if(!aux.isEmpty() && !stocks.isEmpty()){
			for(Utilizador u : aux){
				u.setAccoes(gestorBD.selectAccoesFromUser(u));
				u.setValor(0);
				for(Accao accao : u.getAccoes()){
					for(Stock stock : stocks){
						if(stock.getSigla().equals(accao.getSigla())){
							u.setValor(u.getValor() + accao.getQuantidade() * stock.getCotacao());
						}
					}
				}
			}
		}
		Collections.sort(aux);
		while(aux.size() > 5){
			aux.remove(5);
		}
		return aux;
	}

	public ArrayList<Utilizador> top5AccoesSaldo(){
		ArrayList<Utilizador> aux = utilizadores;
		if(!aux.isEmpty() && !stocks.isEmpty()){
			for(Utilizador u : aux){
				u.setValor(0);
				for(Accao accao : u.getAccoes()){
					for(Stock stock : stocks){
						if(stock.getSigla().equals(accao.getSigla())){
							u.setValor(u.getValor() + accao.getQuantidade() * stock.getCotacao());
						}
					}
				}
				u.setValor(u.getValor() + u.getSaldo());
			}
		}
		Collections.sort(aux);
		while(aux.size() > 5){
			aux.remove(5);
		}
		return aux;
	}

	public String gerarFicheiroCSV(Utilizador utilizador, String filename){
		
		utilizador.setAccoes(gestorBD.selectAccoesFromUser(utilizador));
		utilizador.setHistorial(gestorBD.selectRegistos(utilizador));
		ArrayList<Integer> sugestoes = gestorBD.selectSugestoes(utilizador);
		
		
//		String filename = getServletContext().getRealPath("") + File.separator + "files" + File.separator + utilizador.getNome() + "_" + data + ".csv";
		try{
//			FileWriter writer = new FileWriter(utilizador.getNome() + "_" + data + ".csv");
			BufferedWriter writer = new BufferedWriter(new FileWriter(filename));
			writer.append("Email");
			writer.append(',');
			writer.append(utilizador.getEmail());
			writer.append('\n');

			writer.append("Username");
			writer.append(',');
			writer.append(utilizador.getNome());
			writer.append('\n');

			writer.append("Data Nascimento (Dia-Mes-Ano)");
			writer.append(',');
			writer.append(utilizador.getDatanascimento());
			writer.append('\n');

			writer.append("Saldo");
			writer.append(',');
			writer.append(utilizador.getSaldo() + "");
			writer.append('\n');
			
			if(!sugestoes.isEmpty()){
			writer.append("Transacoes Realizadas");
			writer.append(',');
			writer.append(sugestoes.get(2) + "");
			writer.append('\n');
			
			writer.append("Seguiu sugestao do Analista");
			writer.append(',');
			writer.append(sugestoes.get(0) + "");
			writer.append('\n');
			
			writer.append("Seguiu sugestao do Vigarista");
			writer.append(',');
			writer.append(sugestoes.get(1) + "");
			writer.append('\n');
			}
			
			writer.append('\n');
			writer.append('\n');

			writer.append("Accoes");
			writer.append('\n');
			writer.append("Nome");
			writer.append(',');
			writer.append("Sigla");
			writer.append(',');
			writer.append("Quantidade");
			writer.append(',');
			writer.append("Valor Aquisicao");
			writer.append(',');
			writer.append("Valor Total");
			writer.append('\n');

			for(Accao accao : utilizador.getAccoes()){
				writer.append(accao.getNome().replaceAll(",", " "));
				writer.append(',');
				writer.append(accao.getSigla());
				writer.append(',');
				writer.append(accao.getQuantidade() + "");
				writer.append(',');
				writer.append(accao.getValorAquisicao() + "");
				writer.append(',');
				writer.append(accao.getValorTotal() + "");
				writer.append('\n');
			}
			
			writer.append('\n');
			writer.append('\n');
			
			writer.append("Historial");
			writer.append('\n');
			writer.append("Data (Ano-Mes-Dia Horas-Minutos-Segundos.Milésimas de Segundo)");
			writer.append(',');
			writer.append("Tipo");
			writer.append(',');
			writer.append("Sigla");
			writer.append(',');
			writer.append("Quantidade");
			writer.append(',');
			writer.append("Valor");
			writer.append('\n');
			
			for(Registo registo : utilizador.getHistorial()){
				Date date = new Date(registo.getTimestamp().getTime());
				writer.append(date + "");
				writer.append(',');
				if(!registo.isCompra_venda()){
					writer.append("COMPRA");
				}else{
					writer.append("VENDA");
				}
				writer.append(',');
				writer.append(registo.getSigla());
				writer.append(',');
				writer.append(registo.getQuantidade() + "");
				writer.append(',');
				writer.append(registo.getValor() + "");
				writer.append('\n');
			}
			//generate whatever data you want

			writer.flush();
			writer.close();
		}
		catch(IOException e){
			e.printStackTrace();
		} 
		
		return filename;
	}
}
